package models

import (
	"encoding/json"
	"fmt"
	"gorm.io/datatypes"
	"gorm.io/gorm"
	"time"
)

// User 用户模型
// swagger:model
type User struct {
	gorm.Model
	Name     string `json:"name" gorm:"size:50;not null"`
	Password string `json:"password" gorm:"size:100;not null"`
	Email    string `json:"email" gorm:"size:100;unique"`
	OpenID   string `json:"open_id" gorm:"size:100;null"`
	Role     string `json:"role" gorm:"size:20;default:'user'"`     // 用户角色: admin 或 user
	Status   string `json:"status" gorm:"size:20;default:'active'"` // 用户状态: active、banned 或 deleted
	// 用户等级（1-10）
	Level int `json:"level" gorm:"default:1"`
	// 用户积分
	Points int `json:"points" gorm:"default:0"`
	// 最后登录时间
	LastLogin time.Time `json:"last_login" gorm:"default:null"`
	// 头像配置
	Avatar    datatypes.JSON `json:"avatar"`     // 头像URL或配置信息
	CreatedAt time.Time      `json:"created_at"` // 创建时间
}

// AvatarConfig 定义头像的具体配置项
type AvatarConfig struct {
	Hair         string `json:"hair"`
	HairColor    string `json:"hairColor"`
	Expression   string `json:"expression"`
	Clothes      string `json:"clothes"`
	ClothesColor string `json:"clothesColor"`
}

// SetAvatar 将 AvatarConfig 转换为 JSON
func (u *User) SetAvatar(config AvatarConfig) error {
	jsonBytes, err := json.Marshal(config)
	if err != nil {
		return err
	}
	u.Avatar = datatypes.JSON(jsonBytes)
	return nil
}

// GetAvatar 从 JSON 解析出 AvatarConfig
func (u *User) GetAvatar() (AvatarConfig, error) {
	var config AvatarConfig
	err := json.Unmarshal(u.Avatar, &config)
	return config, err
}

func GetUserByID(id string) *User {
	var user User
	if err := GetDB().Where("id = ?", id).First(&user).Error; err != nil {
		return nil
	}
	return &user
}

// ValidateUserToken 验证用户Token
func ValidateUserToken(userId string, token string) bool {
	// 这里使用一个简单的验证方式，实际项目中应该使用更安全的JWT验证
	expectedToken := fmt.Sprintf("token_%s_%d", userId, time.Now().Unix()/3600)                              // Token每小时更新
	oneHourAgoToken := fmt.Sprintf("token_%s_%d", userId, (time.Now().Unix()/3600)-1) // 允许前一个小时的Token
	
	// 记录验证信息用于调试
	fmt.Printf("ValidateUserToken - userId: %s, token: %s, expectedToken: %s, oneHourAgoToken: %s\n", userId, token, expectedToken, oneHourAgoToken)
	
	return token == expectedToken || token == oneHourAgoToken
}

// BeforeDelete 在删除用户之前将状态更新为deleted
func (u *User) BeforeDelete(tx *gorm.DB) error {
	return tx.Model(u).Update("status", "deleted").Error
}
